package io.ent.modules.file.service;

import com.alibaba.fastjson.JSONObject;
import io.ent.common.utils.FileTypeUtil;
import io.ent.common.utils.StringUtil;
import io.ent.modules.file.entity.Param;
import io.ent.modules.file.entity.Result;
import org.apache.logging.log4j.util.PropertiesUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

@Service("fileService")
public class FileService {
	@Value("${file.fileSize}")
	private  int FilefileSize;
	@Value("${file.filePath}")
	private  String filePath;
	/**
	 * 上传文件
	 * @param request
	 * @param param		参数对象
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	public String upload(HttpServletRequest request, Param param) throws IllegalStateException, IOException {
		int fileType = param.getFileType();
		int fileSize = param.getFileSize();
		//如果不限制文件大小，则取默认文件大小限制
		fileSize = fileSize==0?FilefileSize:fileSize;
		
		String path =  filePath + "/" + param.getFilePath();

		
		File dir = new File(path);
		
		List<Result> list = new ArrayList<Result>();
		// 创建一个通用的多部分解析器
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
		// 判断 request 是否有文件上传,即多部分请求
		if (multipartResolver.isMultipart(request)) {
			// 转换成多部分request
			MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
			// 取得request中的所有文件名
			Iterator<String> iter = multiRequest.getFileNames();
			while (iter.hasNext()) {
				// 取得上传文件
				MultipartFile file = multiRequest.getFile(iter.next());

				if (file != null) {
 					// 取得当前上传文件的文件名称
					String myFileName = file.getOriginalFilename();
					// 如果名称长度大于0,说明有文件上传
					if (myFileName.trim().length() > 0) { 
							// 判断文件大小
							if (file.getSize() > fileSize) {
								list.add(new Result(0, myFileName + "文件太大", ""));
								continue;
							} 
						
						//是否判断文件类型
						boolean checkFileType = true;
						if(fileType==0){//图片类型
							FileTypeUtil.clearFileType();
							FileTypeUtil.getImageType();
						}else if(fileType==1){//文件类型
							FileTypeUtil.clearFileType();
							FileTypeUtil.getFileType();
						}else if(fileType==3){//视频类型
							FileTypeUtil.clearFileType();
							FileTypeUtil.getVideoType();
						}else if(fileType==2){//全部类型
							checkFileType = false;
						}
						String realFileType = FileTypeUtil.getFileTypeByStream(file.getInputStream());
						// 判断文件是否有效
						if (checkFileType&&realFileType == null) {
							list.add(new Result(0, myFileName + "文件无效", ""));
							continue;
						}

						//获取文件的扩展名
						String suffix = "";
						int pos = myFileName.lastIndexOf(".");
						if(pos>-1) suffix = myFileName.substring(pos+1);
						String[] arr = {"doc","docx","xls","xlsx"};
						//如果扩展名不在指定数组中，则需要改成其真正的扩展名
						if(checkFileType&&!StringUtil.arrayContainValue(arr, suffix)){
							suffix = realFileType;
						}
						// 重命名上传后的文件名
						String fileName  = UUID.randomUUID().toString();
						//如果原文件有扩展名，则加上扩展名
						if(!"".equals(suffix)) fileName = fileName + "." + suffix;
						
						// 定义上传路径
						//如果目录不存在就创建目录
						if (!dir.exists()) dir.mkdirs();
						String filePath =path + fileName;
						File localFile = new File(filePath);
						file.transferTo(localFile); 
						
						list.add(new Result(1, myFileName + "上传成功", param.getFilePath() , myFileName, fileName));
						
						//删除旧文件
						deleteFile(path+"/"+ param.getOldFileName());
						//deleteFile(path123 + param.getOldFileName());
					} else {
						list.add(new Result(0, "请选择文件", ""));
						//break;
						continue;
					}
				}
			}
		}
		return JSONObject.toJSONString(list);
	}
	/**
	 * 删除文件
	 * @param request
	 * @param param		参数对象
	 * @return
	 */
	public String delete(HttpServletRequest request, Param param){
		String filepath = param.getFilePath();
		String path = filePath + "/" + filepath;
		
		Result result = null;
		if(deleteFile(path)){
			result = new Result(1,"成功刪除");
		}else{
			result = new Result(0,"文件不存在，删除失败");
		}

	    return JSONObject.toJSONString(result);
	}
	/**
	 * 删除文件
	 * @param filePath		待删除文件的完整路径
	 * @return
	 */
	private boolean deleteFile(String filePath){
		File file = new File(filePath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			return true;
		}else{
			return false;
		}
	}
}
